package visiopuce.action;

import java.util.List;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Alteration;
import visiopuce.objets.Analyse;
import visiopuce.objets.Personne;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Puce;
import visiopuce.objets.Resultat;
import visiopuce.service.AlterationServiceImpl;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.DroitServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.PuceServiceImpl;
import visiopuce.service.ResultatServiceImpl;
import visiopuce.ui.view.DossierEditor;

public class ActionSupprimer extends Action {

	Object obj;
	private DossierEditor editor;

	public ActionSupprimer(Object obj, DossierEditor editor) {
		super("Supprimer");
		this.obj = obj;
		this.editor = editor;
	}

	public void run() {
		if (obj instanceof Personne && DroitServiceImpl.getInstance().peutSupprimerByUtilisateurAndChamp(ApplicationContexte.getInstance().getUtilisateur(), "personne")) {
			List<Prelevement> prelevements = PrelevementServiceImpl.getInstance().findAllByidPersonne(((Personne) obj).getIdPersonne());
			if (prelevements.size() > 0) {
				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Attention", "Cette personne possède des prélèvements, il est impossible de supprimer la personne");
			} else {
				boolean aSupprimer = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Attention", "Vous êtes sur le point de supprimer le dossier " + ((Personne) obj).getNom() + " " + ((Personne) obj).getPrenom() + ". Etes vous certain de vouloir le supprimer?");
				if (aSupprimer) {
					PersonneServiceImpl.getInstance().delete(((Personne) obj));
				}
			}
		} else if (obj instanceof Prelevement && DroitServiceImpl.getInstance().peutSupprimerByUtilisateurAndChamp(ApplicationContexte.getInstance().getUtilisateur(), "prelevement")) {
			List<Analyse> analyses = AnalyseServiceImpl.getInstance().findAllByidPrelevement(((Prelevement) obj).getIdPrelevement());
			if (analyses.size() > 0) {
				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Attention", "Ce prélèvement possède des analyses, il est impossible de supprimer le prelèvement");
			} else {
				boolean aSupprimer = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Attention", "Vous êtes sur le point de supprimer le prelèvement " + ((Prelevement) obj).getNumeroPrelevement() + ". Etes vous certain de vouloir le supprimer?");
				if (aSupprimer) {
					PrelevementServiceImpl.getInstance().delete(((Prelevement) obj));
				}
			}
		} else if (obj instanceof Analyse && DroitServiceImpl.getInstance().peutSupprimerByUtilisateurAndChamp(ApplicationContexte.getInstance().getUtilisateur(), "analyse")) {
			List<Resultat> resultats = ResultatServiceImpl.getInstance().findAllByidAnalyse(((Analyse) obj).getIdAnalyse());
			if (resultats.size() > 0) {
				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Attention", "Cette analyse possède des résultats, il est impossible de supprimer l'analyse");
			} else {
				List<Puce> puces = PuceServiceImpl.getInstance().findAllByidAnalyse(((Analyse) obj).getIdAnalyse());
				if (puces.size() > 0) {
					MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Attention", "Cette analyse est liée à une puce, il est impossible de supprimer l'analyse");
				} else {
					boolean aSupprimer = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Attention", "Vous êtes sur le point de supprimer l'analyse numéro " + ((Analyse) obj).getIdAnalyse() + ". Etes vous certain de vouloir la supprimer?");
					if (aSupprimer) {
						AnalyseServiceImpl.getInstance().delete(((Analyse) obj));
					}
				}
			}
		} else if (obj instanceof Puce && DroitServiceImpl.getInstance().peutSupprimerByUtilisateurAndChamp(ApplicationContexte.getInstance().getUtilisateur(), "puce")) {
			long nbAlt = AlterationServiceImpl.getInstance().nbAltByidPuce(((Puce) obj).getIdPuce());
			if (nbAlt > 0) {
				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Attention", "Cette puce possède des CNV, il est impossible de supprimer la puce");
			} else {
				boolean aSupprimer = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Attention", "Vous êtes sur le point de supprimer la puce " + ((Puce) obj).getIdPuce() + ". Etes vous certain de vouloir le supprimer?");
				if (aSupprimer) {
					PuceServiceImpl.getInstance().delete(((Puce) obj));
				}
			}
		} else if (obj instanceof Resultat && DroitServiceImpl.getInstance().peutSupprimerByUtilisateurAndChamp(ApplicationContexte.getInstance().getUtilisateur(), "resultat")) {
			if (((Resultat) obj).getDateRendu() != null) {
				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Attention", "Ce résultat a déjà été rendu, il est impossible de le supprimer");

			} else {
				boolean aSupprimer = MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "Attention", "Vous êtes sur le point de supprimer le résutlat " + ((Resultat) obj).getIdResultat() + ". Etes vous certain de vouloir le supprimer?");
				if (aSupprimer) {
					ResultatServiceImpl.getInstance().delete(((Resultat) obj));
				}
			}
		}
		editor.refreshTreeView();
	}
}
